#include <head.h>
// 如果要实现 父子进程 同时进行读 写操作

/*
    翻车了不成立
*/

typedef struct fds
{
    int flag;
    int fd;
} fds;

// 读线程
void *pthread_read(void *fd)
{
    // 获取读端文件描述符
    fds data = *((fds *)fd);
    // 声明一个缓冲区
    char buf[1024];
    // 开始循环
    while (1)
    {
        if(data.flag == 0)
        {

        }
    }
}

// 写线程
void *pthread_write(void *fd)
{
    // 获取写端文件描述符
    fds data = *((fds *)fd);
    // 声明一个缓冲区
    char buf[1024];

    while (1)
    {
        // 父进程
        if(data.flag == 1)
        {
            strcpy(buf , "我是你爹\n");
            buf[strlen(buf)] = '\0';
            write(data.fd , buf , strlen(buf));
        }
    }
    
}

int main(int argc, char const *argv[])
{
    // 声明管道的文件描述符
    int pipe_1[2];
    int pipe_2[2];

    // 声明进程的 pid
    pid_t pid;

    // 声明线程的id
    pthread_t tid_r; // 读线程
    pthread_t tid_w; // 写线程

    // 创建管道文件  父进程读  子进程写
    if (-1 == pipe(pipe_1))
    {
        ERRLOG("管道创建失败");
        return 0;
    }

    // 创建管道文件  子进程读  父进程写
    if (-1 == pipe(pipe_2))
    {
        ERRLOG("管道创建失败");
        return 0;
    }

    // 创建进程
    if (-1 == (pid = fork()))
    {
        ERRLOG("进程创建失败");
        return 0;
    }
    else if (pid == 0) // 子进程
    {
        // 管道1  子进程关闭读端
        close(pipe_1[0]);
        // 管道2  子进程关闭写端
        close(pipe_2[1]);

        fds data;

        // 创建线程
        data.flag = 0;
        data.fd = pipe_2[0];
        pthread_create(&tid_r, NULL, pthread_read, (void *)&data);

        data.flag = 0;
        data.fd = pipe_1[1];
        pthread_create(&tid_w, NULL, pthread_write, (void *)&data);

        // 回收线程
        pthread_join(tid_r, NULL);
        pthread_join(tid_w, NULL);
    }
    else if (pid > 0) // 父进程
    {
        // 管道1  父进程关闭写端
        close(pipe_1[1]);
        // 管道2  父进程关闭读端
        close(pipe_2[0]);
        fds data;

        // 创建线程
        data.flag = 1;
        data.fd = pipe_1[0];
        pthread_create(&tid_r, NULL, pthread_read, (void *)&data);

        data.flag = 1;
        data.fd = pipe_2[1];
        pthread_create(&tid_w, NULL, pthread_write, (void *)&data);

        // 回收线程
        pthread_join(tid_r, NULL);
        pthread_join(tid_w, NULL);

        // 回收子进程
        wait(NULL);
    }

    return 0;
}